import { ReactiveProperty } from './ReactiveProperty';
import { Asap } from './CreatorSchedule';
import { _decorator } from 'cc';
import { EDITOR } from 'cc/env';
const { ccclass, property, float } = _decorator;

/*
兼容属性检查器的number类型显示和初值，如果不需要属性检查器兼容性，请直接使用ReactiveProperty<number>

使用方式：
@property(ReactiveNumber)
rp0 = ReactiveNumber.DefaultValue(10);

如果希望在属性检查器中简单呈现值而非一个子结构：
@property(ReactiveNumber)
_rp4: ReactiveNumber = ReactiveNumber.DefaultValue(100);
@property // 如果需要滑动条，这一行改为: @property({ slide: true, range: [0, 1, .01] })
get rp4(): number { return this._rp4.value; }
set rp4(v: number) { this._rp4.Value = v; }

这是一种enum的形式，其本质是一个number
@property(ReactiveNumber)
_rp3: ReactiveNumber = ReactiveNumber.DefaultValue(MyType.one);
@property({ type: MyType })
get rp3(): MyType { return this._rp3.value }
set rp3(v: MyType) { this._rp3.Value = v; }

注意:
    如果需要以属性检查器来为准设定初始值，则必须在实现BaseView的willBind中以获取属性编辑器上的值，否则选用_Value默认值:
    willBind() {
        this._rp4.loadValue();
    }

之所以要做兼容属性检查器的原因：
一方面可以再属性检查器编辑初始值，且应用了rx开发思路的基础数据类型。
另一方面，配合executeInEditMode，继承BaseView，实现useObserves，使之进入Rx管理体系，就可以在场景编辑器实时预览结果。
 */

@ccclass('ReactiveNumber')
export class ReactiveNumber extends ReactiveProperty<number> {

    constructor() {
        super();
        this.init(this.Value); // 此时的Value没有解析出来，用的是默认值，绑定前需要loadValue
    }

    static DefaultValue(value?: number): ReactiveNumber {
        let rp = new ReactiveNumber();
        if (value != null) rp.Value = value;
        return rp;
    }

    @property
    private _Value: number = 0;
    @property
    public get Value(): number { return this._Value; }
    public set Value(v: number) { this._Value = v; if (this._subject) this.value = v; }

    loadValue() {
        this.value = this.Value;
    }
}

